#pragma once

#include "Common.h"

#include <array>
#include <cstddef>

namespace mp {

/* 线程本地缓存 */
class ThreadCache {
  public:
    static ThreadCache *getInstance() {
        static thread_local ThreadCache instance;
        return &instance;
    }

    void *allocate(size_t size);
    void deallocate(void *ptr, size_t size);

  private:
    ThreadCache() = default;
    void *fetchFromCentralCache(size_t idx);              // 从 CentralCache 中获取内存
    void returnToCentralCache(void *start, size_t size);  // 归还内存到 CentralCache
    size_t getBatchNum(size_t size);                      // 计算批量获取内存块的数量
    bool shouldReturnToCentralCache(size_t idx);          // 判断是否需要归还内存给 CentralCache

  private:
    std::array<void *, FREE_LIST_SIZE> freeList_;      // 每个线程的自由链表数组
    std::array<size_t, FREE_LIST_SIZE> freeListSize_;  // 自由链表大小统计
};

};  // namespace mp